package cn.tedu.justone.pack01;

/**
 * ZZ：JustOne
 * VX：Andylau2020smile
 * DY：JustOne2018
 * ZT：《》
 */
public class Demo33_Synchronized禁止代码重排序测试 {

    //Synchronized禁止代码重排序的测试
    //Synchronized禁止代码重排序的测试
    //Synchronized禁止代码重排序的测试
    //
    //整个代码都是复制《Volatile禁止代码重排序的测试》，
    //本篇是想验证Synchronized也可以实现Volatile禁止代码重排序的效果
    //
    //测试方案：
    // 1,测试方案一，用死循环运行后出现x==0&&y==0的情况(count = 855653,0,0)，
    //   这说明代码重排序了，将：
    //   a = 1;
    //   x = b;
    //   由于x=b耗时量更轻，所以提前了，重排序成了：
    //   x = b;
    //   a = 1; 即是把 x = b;前置了，否则不可能出现 x==0&&y==0
    //
    // 2,测试方案二，如现在的代码：
    //   a = 1;
    //   synchronized (this){}
    //   x = b;
    //   也即是用 synchronized (this){} 对 a和x进行了隔离，运行，
    //   发现不会出现x==0&&y==0
    //   说明synchronized (this){}前后的代码不可以重排到后前。
    //   测试时，为了不浪费时间，运行到100 0000就行了。
    //

    private static long a = 0;
    private static long b = 0;

    private static long x = 0;
    private static long y = 0;

    private static long count = 0;

    public static void main(String[] args) throws InterruptedException {
        String lock = "刘景景";
        while(true){
            a = 0;
            b = 0;
            x = 0;
            y = 0;
            count++;

            Thread t1 = new Thread(){
                @Override
                public void run() {
                    a = 1;
                    synchronized (lock){}//书上是使this，即不同的锁，我用相同的好像也可以
                    x = b;
                }
            };

            Thread t2 = new Thread(){
                @Override
                public void run() {
                    b = 1;
                    synchronized (lock){}//书上是使this，即不同的锁，我用相同的好像也可以
                    y = a;
                }
            };

            t1.start();
            t2.start();
            t1.join();
            t2.join();

            String str = "count = " + count + "," + x + "," + y;

            if(x==0 && y==0){
                System.out.println("---"+str);
                break;
            }else{
                System.out.println(str);
            }
        }

    }
}














